package 中等.二分查找;

import java.util.ArrayList;
import java.util.List;

/**
 * 如果数组的每一对相邻元素都是两个奇偶性不同的数字，则该数组被认为是一个 特殊数组 。
 * 你有一个整数数组 nums 和一个二维整数矩阵 queries，对于 queries[i] = [fromi, toi]，请你帮助你检查
 * 子数组
 * nums[fromi..toi] 是不是一个 特殊数组 。
 * 返回布尔数组 answer，如果 nums[fromi..toi] 是特殊数组，则 answer[i] 为 true ，否则，answer[i] 为 false 。
 *
 * @ https://leetcode.cn/problems/special-array-ii/description/?envType=daily-question&envId=2024-08-14
 * @date 2024/08/18
 */
public class 特殊数组II_3152 {

    public static void main(String[] args) {

    }

    /**
     * 预处理+二分
     * 先将子串中是特殊数组的数组记录下来，查询 queries[i] 的区间是否在特殊数组的范围里面
     */
    public boolean[] isArraySpecial(int[] nums, int[][] queries) {

        List<int[]> list = new ArrayList<>();
        int left = 0;
        while (left < nums.length) {
            int right = left + 1;
            while (right < nums.length && nums[right] % 2 != nums[right - 1] % 2) {
                right++;
            }

            list.add(new int[]{left, right - 1});
            left = right;
        }

        boolean[] ans = new boolean[queries.length];

        for (int i = 0; i < queries.length; i++) {

            ans[i] = isSpecial(list, queries[i]);
        }

        return ans;
    }

    // 找到 list[i][0] <= query[0] 的最大索引 i
    private boolean isSpecial(List<int[]> list, int[] query) {
        int left = 0, right = list.size() - 1;

        int idx = -1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (list.get(mid)[0] <= query[0]) {
                idx = mid;
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }

        if (idx == -1) {
            return false;
        }
        return list.get(idx)[1] >= query[1];
    }

}
